package com.itcam.otcbackend.controller;

import com.itcam.otcbackend.common.BaseResponse;
import com.itcam.otcbackend.enums.ErrorCode;
import com.itcam.otcbackend.model.dto.space.analyze.request.SpaceCategoryAnalyzeRequest;
import com.itcam.otcbackend.model.dto.space.analyze.request.SpaceSizeAnalyzeRequest;
import com.itcam.otcbackend.model.dto.space.analyze.request.SpaceUsageAnalyzeRequest;
import com.itcam.otcbackend.model.dto.space.analyze.request.SpaceUserAnalyzeRequest;
import com.itcam.otcbackend.model.dto.space.analyze.response.SpaceCategoryAnalyzeResponse;
import com.itcam.otcbackend.model.dto.space.analyze.response.SpaceSizeAnalyzeResponse;
import com.itcam.otcbackend.model.dto.space.analyze.response.SpaceUsageAnalyzeResponse;
import com.itcam.otcbackend.model.dto.space.analyze.response.SpaceUserAnalyzeResponse;
import com.itcam.otcbackend.model.po.User;
import com.itcam.otcbackend.service.SpaceAnalyzeService;
import com.itcam.otcbackend.service.UserService;
import com.itcam.otcbackend.utils.ResultUtils;
import com.itcam.otcbackend.utils.ThrowUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;

@RestController
@RequestMapping("/space/analyze")
public class SpaceAnalyzeController {

    @Resource
    private SpaceAnalyzeService spaceAnalyzeService;

    @Resource
    private UserService userService;

    /**
     * 获取空间使用状态
     *
     * 该方法接收一个空间使用分析请求对象和 HTTP 请求对象，
     * 用于获取当前登录用户的信息，然后调用空间分析服务的
     * 对应方法来获取空间使用分析结果，并将结果封装在基础
     * 响应对象中返回。
     *
     * @param spaceUsageAnalyzeRequest 空间使用分析请求对象，包含分析所需的参数
     * @param request HTTP 请求对象，用于获取当前登录用户信息
     * @return 包含空间使用分析响应结果的基础响应对象
     */
    @PostMapping("/usage")
    public BaseResponse<SpaceUsageAnalyzeResponse> getSpaceUsageAnalyze(
            // 从请求体中获取空间使用分析请求对象
            @RequestBody SpaceUsageAnalyzeRequest spaceUsageAnalyzeRequest,
            // 获取 HTTP 请求对象
            HttpServletRequest request
    ) {
        // 检查请求对象是否为空，如果为空则抛出参数错误异常
        ThrowUtils.throwIf(spaceUsageAnalyzeRequest == null, ErrorCode.PARAMS_ERROR);
        // 从 HTTP 请求中获取当前登录用户信息
        User loginUser = userService.getLoginUser(request);
        // 调用空间分析服务的方法，传入请求对象和登录用户信息，获取空间使用分析结果
        SpaceUsageAnalyzeResponse spaceUsageAnalyze = spaceAnalyzeService.getSpaceUsageAnalyze(spaceUsageAnalyzeRequest, loginUser);
        // 将空间使用分析结果封装在基础响应对象中并返回成功响应
        return ResultUtils.success(spaceUsageAnalyze);
    }

    /**
     * 通过 POST 请求获取空间图片分类分析数据
     *
     * 该方法接收一个空间分类分析请求对象和 HTTP 请求对象，
     * 从 HTTP 请求中获取当前登录用户信息，然后调用空间分析服务
     * 的对应方法进行空间图片分类分析，并将分析结果封装在基础
     * 响应对象中返回。
     *
     * @param spaceCategoryAnalyzeRequest 空间分类分析请求对象，包含分析所需的参数
     * @param request HTTP 请求对象，用于获取当前登录用户信息
     * @return 包含空间图片分类分析结果列表的基础响应对象
     */
    @PostMapping("/category")
    public BaseResponse<List<SpaceCategoryAnalyzeResponse>> getSpaceCategoryAnalyze(
            // 从请求体中获取空间分类分析请求对象
            @RequestBody SpaceCategoryAnalyzeRequest spaceCategoryAnalyzeRequest,
            // 获取 HTTP 请求对象
            HttpServletRequest request
    ) {
        // 检查请求对象是否为空，如果为空则抛出参数错误异常
        ThrowUtils.throwIf(spaceCategoryAnalyzeRequest == null, ErrorCode.PARAMS_ERROR);
        // 从 HTTP 请求中获取当前登录用户信息
        User loginUser = userService.getLoginUser(request);
        // 调用空间分析服务的方法，传入请求对象和登录用户信息，获取空间图片分类分析结果列表
        List<SpaceCategoryAnalyzeResponse> resultList = spaceAnalyzeService.getSpaceCategoryAnalyze(spaceCategoryAnalyzeRequest, loginUser);
        // 将空间图片分类分析结果列表封装在基础响应对象中并返回成功响应
        return ResultUtils.success(resultList);
    }

    /**
     * 通过 POST 请求获取空间图片大小分析数据
     *
     * 该方法接收一个空间大小分析请求对象和 HTTP 请求对象，
     * 从 HTTP 请求中获取当前登录用户信息，然后调用空间分析服务
     * 的对应方法进行空间图片大小分析，并将分析结果封装在基础
     * 响应对象中返回。
     *
     * @param spaceSizeAnalyzeRequest 空间大小分析请求对象，包含分析所需的参数
     * @param request HTTP 请求对象，用于获取当前登录用户信息
     * @return 包含空间图片大小分析结果列表的基础响应对象
     */
    @PostMapping("/size")
    public BaseResponse<List<SpaceSizeAnalyzeResponse>> getSpaceSizeAnalyze(
            // 从请求体中获取空间大小分析请求对象
            @RequestBody SpaceSizeAnalyzeRequest spaceSizeAnalyzeRequest,
            // 获取 HTTP 请求对象
            HttpServletRequest request
    ) {
        // 检查请求对象是否为空，如果为空则抛出参数错误异常
        ThrowUtils.throwIf(spaceSizeAnalyzeRequest == null, ErrorCode.PARAMS_ERROR);
        // 从 HTTP 请求中获取当前登录用户信息
        User loginUser = userService.getLoginUser(request);
        // 调用空间分析服务的方法，传入请求对象和登录用户信息，获取空间图片大小分析结果列表
        List<SpaceSizeAnalyzeResponse> resultList = spaceAnalyzeService.getSpaceSizeAnalyze(spaceSizeAnalyzeRequest, loginUser);
        // 将空间图片大小分析结果列表封装在基础响应对象中并返回成功响应
        return ResultUtils.success(resultList);
    }

    /**
     * 通过 POST 请求获取用户上传行为分析数据
     *
     * 该方法接收一个空间用户分析请求对象和 HTTP 请求对象，
     * 从 HTTP 请求中获取当前登录用户信息，然后调用空间分析服务
     * 的对应方法进行用户上传行为分析，并将分析结果封装在基础
     * 响应对象中返回。
     *
     * @param spaceUserAnalyzeRequest 空间用户分析请求对象，包含分析所需的参数
     * @param request HTTP 请求对象，用于获取当前登录用户信息
     * @return 包含用户上传行为分析结果列表的基础响应对象
     */
    @PostMapping("/user")
    public BaseResponse<List<SpaceUserAnalyzeResponse>> getSpaceUserAnalyze(
            // 从请求体中获取空间用户分析请求对象
            @RequestBody SpaceUserAnalyzeRequest spaceUserAnalyzeRequest,
            // 获取 HTTP 请求对象
            HttpServletRequest request
    ) {
        // 检查请求对象是否为空，如果为空则抛出参数错误异常
        ThrowUtils.throwIf(spaceUserAnalyzeRequest == null, ErrorCode.PARAMS_ERROR);
        // 从 HTTP 请求中获取当前登录用户信息
        User loginUser = userService.getLoginUser(request);
        // 调用空间分析服务的方法，传入请求对象和登录用户信息，获取用户上传行为分析结果列表
        List<SpaceUserAnalyzeResponse> resultList = spaceAnalyzeService.getSpaceUserAnalyze(spaceUserAnalyzeRequest, loginUser);
        // 将用户上传行为分析结果列表封装在基础响应对象中并返回成功响应
        return ResultUtils.success(resultList);
    }


}
